【MySQL】比較演算 - 値の比較と演算子
MySQLは値の関係性について真偽を判定できます。
ここでは、その処理である比較演算を解説します。
検証環境
比較演算
比較演算は“値の関係性の真偽を判定する演算”です。
演算結果として、関係性が正しい場合はTRUE(1)、正しくない場合はFALSE(0)を算出します。
例えば、“3と8は等しい”という関係性について、3と8は等しくないため、FALSEになります。
比較演算子
比較演算子は比較演算の種類を表す記号です。
次の表のように比較演算は様々な種類があり、各比較演算に対応した演算子があります。
| 演算 | 演算子 | 構文 |
|---|---|---|
| AとBは『等しい』 | =, <=> |
A = B, A <=> B |
| AとBは『等しくない』 | <>, != |
A <> B, A != B |
| AはB『よりも小さい』 | < |
A < B |
| AはB『以下』 | <= |
A <= B |
| AはB『よりも大きい』 | > |
A > B |
| AはB『以上』 | >= |
A >= B |
| Aは『NULLである』 | IS NULL |
A IS NULL |
| Aは『NULLではない』 | IS NOT NULL |
A IS NOT NULL |
| Aは『TRUE/FALSEである』 | IS |
A IS TRUE, A IS FALSE |
| Aは『TRUE/FALSEではない』 | IS NOT |
A IS NOT TRUE, A IS NOT FALSE |
| Aは『value1以上、value2以下の値である』 | BETWEEN AND |
A BETWEEN value1 AND value2 |
| Aは『value1以上、value2以下の値ではない』 | NOT BETWEEN AND |
A NOT BETWEEN value1 AND value2 |
| Aは『いずれかの値に等しい』 | IN |
A IN (value, value...) |
| Aは『いずれの値とも等しくない』 | NOT IN |
A NOT IN (value, value...) |
| Aは『パターンにマッチする』 | LINKE |
A LINKE pattern |
| Aは『パターンにマッチしない』 | NOT LIKE |
A NOT LIKE pattern |
また、演算結果は1(TRUE)または0(FALSE)になります。
等しい(=, <=>)
2値の関係性が『等しい』の演算は=演算子を使います。
mysql> SELECT 8 = 8 , 0 = 0, 3 = 8;
+-------+-------+-------+
| 8 = 8 | 0 = 0 | 3 = 8 |
+-------+-------+-------+
| 1 | 1 | 0 |
+-------+-------+-------+
1 row in set (0.00 sec)
また、値のNULLについて、=演算子は対応していません。
mysql> SELECT NULL = NULL, 8 = NULL;
+-------------+----------+
| NULL = NULL | 8 = NULL |
+-------------+----------+
| NULL | NULL |
+-------------+----------+
1 row in set (0.00 sec)
この結果から分かるように=演算子でNULLを使うと、期待する演算になりません。(結果がNULLになる)
NULLを含む場合は<=>演算子を使用します。
mysql> SELECT NULL <=> NULL, 8 <=> NULL, 8 <=> 8, 3 <=> 8;
+---------------+------------+---------+---------+
| NULL <=> NULL | 8 <=> NULL | 8 <=> 8 | 3 <=> 8 |
+---------------+------------+---------+---------+
| 1 | 0 | 1 | 0 |
+---------------+------------+---------+---------+
1 row in set (0.00 sec)
等しくない(<>, !=)
2値の関係性が『等しくない』の演算は<>演算子を使います。
mysql> SELECT 8 <> 3, 8 <> 8;
+--------+--------+
| 8 <> 3 | 8 <> 8 |
+--------+--------+
| 1 | 0 |
+--------+--------+
1 row in set (0.00 sec)
また、!=演算子でも同様の演算を行えます。
mysql> SELECT 8 != 3, 8 != 8;
+--------+--------+
| 8 != 3 | 8 != 8 |
+--------+--------+
| 1 | 0 |
+--------+--------+
1 row in set (0.00 sec)
よりも小さい(<)
2値の関係性が『よりも小さい』の演算は<演算子を使います。
mysql> SELECT 3 < 8, 8 < 3, 8 < 8;
+-------+-------+-------+
| 3 < 8 | 8 < 3 | 8 < 8 |
+-------+-------+-------+
| 1 | 0 | 0 |
+-------+-------+-------+
1 row in set (0.00 sec)
mysql>
以下(<=)
2値の関係性が『以下』の演算は<=演算子を使います。
mysql> SELECT 3 <= 8, 8 <= 3, 8 <= 8;
+--------+--------+--------+
| 3 <= 8 | 8 <= 3 | 8 <= 8 |
+--------+--------+--------+
| 1 | 0 | 1 |
+--------+--------+--------+
1 row in set (0.00 sec)
よりも大きい(>)
2値の関係性が『よりも大きい』の演算は>演算子を使います。
mysql> SELECT 8 > 3, 3 > 8, 8 > 8;
+-------+-------+-------+
| 8 > 3 | 3 > 8 | 8 > 8 |
+-------+-------+-------+
| 1 | 0 | 0 |
+-------+-------+-------+
1 row in set (0.00 sec)
以上(>=)
2値の関係性が『以上』の演算は>=演算子を使います。
mysql> SELECT 8 >= 3, 3 >= 8, 8 >= 8;
+--------+--------+--------+
| 8 >= 3 | 3 >= 8 | 8 >= 8 |
+--------+--------+--------+
| 1 | 0 | 1 |
+--------+--------+--------+
1 row in set (0.00 sec)
NULLである(IS NULL)
ある値が『NULLである』の演算はIS NULL演算子を使います。
mysql> SELECT NULL IS NULL, 8 IS NULL;
+--------------+-----------+
| NULL IS NULL | 8 IS NULL |
+--------------+-----------+
| 1 | 0 |
+--------------+-----------+
1 row in set (0.00 sec)
NULLではない(IS NOT NULL)
ある値が『NULLではない』の演算はIS NOT NULL演算子を使います。
mysql> SELECT NULL IS NOT NULL, 8 IS NOT NULL;
+------------------+---------------+
| NULL IS NOT NULL | 8 IS NOT NULL |
+------------------+---------------+
| 0 | 1 |
+------------------+---------------+
1 row in set (0.00 sec)
TRUE/FALSEである(IS)
ある値が『TRUE/FALSEである』の演算はIS演算子を使います。
mysql> SELECT 1 IS TRUE, 0 IS FALSE, 88 IS TRUE, 88 IS FALSE;
+-----------+------------+------------+-------------+
| 1 IS TRUE | 0 IS FALSE | 88 IS TRUE | 88 IS FALSE |
+-----------+------------+------------+-------------+
| 1 | 1 | 1 | 0 |
+-----------+------------+------------+-------------+
1 row in set (0.00 sec)
TRUE/FALSEではない(IS NOT)
ある値が『TRUE/FALSEではない』の演算はIS NOT演算子を使います。
mysql> SELECT 0 IS NOT TRUE, 1 IS NOT FALSE, 88 IS NOT TRUE, 88 IS NOT FALSE;
+---------------+----------------+----------------+-----------------+
| 0 IS NOT TRUE | 1 IS NOT FALSE | 88 IS NOT TRUE | 88 IS NOT FALSE |
+---------------+----------------+----------------+-----------------+
| 1 | 1 | 0 | 1 |
+---------------+----------------+----------------+-----------------+
1 row in set (0.00 sec)
value1以上、value2以下の値である(BETWEEN AND)
ある値が『value1以上、value2以下の値である』の演算はBETWEEN AND演算子を使います。
mysql> SELECT 8 BETWEEN 3 AND 10, 8 BETWEEN 11 AND 17, 8 BETWEEN 8 AND 10, 8 BETWEEN 3 AND 8;
+--------------------+---------------------+--------------------+-------------------+
| 8 BETWEEN 3 AND 10 | 8 BETWEEN 11 AND 17 | 8 BETWEEN 8 AND 10 | 8 BETWEEN 3 AND 8 |
+--------------------+---------------------+--------------------+-------------------+
| 1 | 0 | 1 | 1 |
+--------------------+---------------------+--------------------+-------------------+
1 row in set (0.00 sec)
value1以上、value2以下の値ではない(NOT BETWEEN AND)
ある値が『value1以上、value2以下の値ではない』の演算はNOT BETWEEN AND演算子を使います。
mysql> SELECT 8 NOT BETWEEN 3 AND 5, 8 NOT BETWEEN 5 AND 10, 8 NOT BETWEEN 8 AND 10, 8 NOT BETWEEN 3 AND 8;
+-----------------------+------------------------+------------------------+-----------------------+
| 8 NOT BETWEEN 3 AND 5 | 8 NOT BETWEEN 5 AND 10 | 8 NOT BETWEEN 8 AND 10 | 8 NOT BETWEEN 3 AND 8 |
+-----------------------+------------------------+------------------------+-----------------------+
| 1 | 0 | 0 | 0 |
+-----------------------+------------------------+------------------------+-----------------------+
1 row in set (0.00 sec)
実行結果から分かるように2つの値も含みます
いずれかの値に等しい(IN)
ある値が『いずれかの値に等しい』の演算はIN演算子を使います。
mysql> SELECT 8 IN (7, 8, 9) , 8 IN (1, 2, 3);
+----------------+----------------+
| 8 IN (7, 8, 9) | 8 IN (1, 2, 3) |
+----------------+----------------+
| 1 | 0 |
+----------------+----------------+
1 row in set (0.01 sec)
いずれの値とも等しくない(NOT IN)
ある値が『いずれの値とも等しくない』の演算はNOT IN演算子を使います。
mysql> SELECT 8 NOT IN (1, 2, 3), 8 NOT IN (7, 8, 9);
+--------------------+--------------------+
| 8 NOT IN (1, 2, 3) | 8 NOT IN (7, 8, 9) |
+--------------------+--------------------+
| 1 | 0 |
+--------------------+--------------------+
1 row in set (0.00 sec)
パターンにマッチする(LIKE)
ある値が『パターンにマッチする』の演算はLIKE演算子を使います。
mysql> SELECT 'Hello World' LIKE '%Hello%', 'Hello World' LIKE '%Good%';
+------------------------------+-----------------------------+
| 'Hello World' LIKE '%Hello%' | 'Hello World' LIKE '%Good%' |
+------------------------------+-----------------------------+
| 1 | 0 |
+------------------------------+-----------------------------+
1 row in set (0.01 sec)
パターン
パターンは文字列と%、_で表現します。
%は任意の0文字以上の文字列、_は任意の1文字を表わします。
パターンにマッチしない(NOT LIKE)
ある値が『パターンにマッチしない』の演算はNOT LIKE演算子を使います。
mysql> SELECT 'Hello World' NOT LIKE '%Good%', 'Hello World' NOT LIKE '%Hello%';
+---------------------------------+----------------------------------+
| 'Hello World' NOT LIKE '%Good%' | 'Hello World' NOT LIKE '%Hello%' |
+---------------------------------+----------------------------------+
| 1 | 0 |
+---------------------------------+----------------------------------+
1 row in set (0.00 sec)
パターン
パターンはLIKEと同じで文字列と%、_で表現します。
%は任意の0文字以上の文字列、_は任意の1文字を表わします。